home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2001 June / PC-WELT 6_2001.ISO / misc / mkcd.pl < prev    next >
Encoding:
Perl Script  |  2001-04-08  |  4.3 KB  |  176 lines

  1. #!/usr/bin/perl
  2. #
  3. # warly <warly@mandrakesoft.com>
  4. #
  5.  
  6. my $version = "0.2.3";
  7.  
  8. use strict;
  9.  
  10. my ($rep,$iso) = @ARGV;
  11. $iso or usage();
  12. $::rep = $rep;
  13. $::ENV{PATH} = "$rep/misc:$ENV{PATH}";
  14. $::ENV{PERLLIB} = "$rep/misc:$ENV{PERLLIB}";
  15. unshift @::INC, "$rep/misc";
  16.  
  17. require "$rep/misc/rpmtools.pm";
  18.  
  19. my $pwd = `pwd`;
  20. chop $pwd;
  21. $iso =~ s/^([^\/])/$pwd\/$1/;
  22.  
  23. my $tmpdir = $ENV{TMPDIR} || "/tmp";
  24. -d $tmpdir or die "$tmpdir does not exist\n";
  25. my $work_dir = "$tmpdir/.build_hdlist";
  26. -d $work_dir or mkdir "$tmpdir/.build_hdlist";
  27.  
  28. my @cd;
  29. open A, "$rep/Mandrake/base/rpmslist";
  30. my ($num,@a);
  31. my %list;
  32. while(<A>){
  33.     /<\/CD>/ and $num = 0;
  34.     /<CD num=(\d+)>/ and do { $num = $1; push @cd, $num};
  35. #    s/\+/\\\+/g;
  36.     /(?:<.*>)*([^<]*)\n/; 
  37.     $1 and do {
  38.         @a = split ' ', $1;
  39.         @list{@a} = map $num,@a;
  40.     }
  41. }
  42.  
  43. my @rpms;
  44. my %name;
  45. my $dir = "$rep/Mandrake/RPMS";
  46. opendir DIR, $dir or die "unable to opendir $dir: !$\n";
  47. foreach (readdir DIR) {
  48.     my ($key, $name) = /(([^\/]*)-[^-]*-[^-]*\.[^\/\.]*)\.rpm$/ or next;
  49.         $name{$name} and next;
  50.     my $n = $list{$name};
  51.     push @{$rpms[$n]}, "$rep/Mandrake/RPMS/$_";
  52.     $name{$name} = 1;
  53. }
  54.  
  55. #goto TOTO;
  56.  
  57. open C, ">$work_dir/hdlists" or die "Could not open $work_dir/hdlists for writing: $!";
  58. my $params = new rpmtools();
  59. my @hdlist;
  60. foreach my $n (@cd){
  61.     print C "hdlist$n.cz Mandrake/RPMS$n CD $n Cooker\n";
  62.     my $hdlist = "$work_dir/hdlist$n.cz";
  63.     $hdlist[$n] = $hdlist;
  64.     $params->build_hdlist(1,9,$work_dir,"$work_dir/hdlist$n.cz",@{$rpms[$n]})
  65. }
  66. close C;
  67. foreach my $n (@cd){
  68.     $params->read_hdlists($hdlist[$n]);
  69.     $params->compute_depslist();
  70. }
  71.  
  72. my @unresolved = $params->get_unresolved_provides_files();
  73. if (@unresolved > 0) {
  74.     $params->clean();
  75.  
  76.     foreach my $n (@cd){
  77.         $params->read_hdlists($hdlist[$n]);
  78.     }
  79.     $params->keep_only_cleaned_provides_files();
  80.     foreach my $n (@cd){
  81.         $params->read_hdlists($hdlist[$n]);
  82.         $params->compute_depslist();
  83.     }
  84. }
  85. print "writing $work_dir/depslits.ordered\n";
  86. open F, ">$work_dir/depslist.ordered" or die "unable to write depslist file $work_dir/depslist.ordered\n";
  87. $params->write_depslist(\*F);
  88. close F;
  89. print "writing $work_dir/provides\n";
  90. open F, ">$work_dir/provides" or die "unable to write provides file $work_dir/provides\n";
  91. $params->write_provides(\*F);
  92. close F;
  93. print "writing $work_dir/compss\n";
  94. open F, ">$work_dir/compss" or die "unable to write compss file $work_dir/compss";
  95. $params->write_compss(\*F);
  96. close F;
  97. foreach my $n (@cd){
  98.     $params->build_hdlist(1,9,$work_dir,"$work_dir/hdlist$n.cz",@{$rpms[$n]})
  99. }
  100.  
  101. #TOTO:
  102.  
  103. my $mkiso = qq{mkisofs -r -J -graft-points -nobak -V "Cooker_CD_1" -b images/cdrom.img -c images/boot.cat -o "$iso/1-Cooker-i586.iso" \\
  104.     Mandrake/base/=$work_dir/compss                \\
  105.         Mandrake/base/=$work_dir/depslist.ordered        \\
  106.     Mandrake/base/=$work_dir/provides            \\
  107.         Mandrake/base/=$work_dir/hdlists};
  108.  
  109. local *A; opendir A, "$rep";
  110. foreach (readdir A){
  111.     /~$/ and next;
  112.     /^(\.{1,2}|Mandrake)$/ and next;
  113.     -d "$rep/$_" and $mkiso .= "\\\n    /$_/=$rep/$_" and next;
  114.     $mkiso .= "\\\n    /=$rep/$_" 
  115. }
  116.  
  117. local *A; opendir A, "$rep/Mandrake";
  118. foreach (readdir A){
  119.     print "Mandrake -- $_\n";
  120.     /~$/ and next;
  121.     /(^(\.{1,2}|base)$|RPMS)/ and next;
  122.     -d "$rep/Mandrake/$_" and $mkiso .= "\\\n    Mandrake/$_/=$rep/Mandrake/$_" and next;
  123.     $mkiso .= "\\\n    Mandrake/=$rep/Mandrake/$_"
  124. }
  125.  
  126. local *A; opendir A, "$rep/Mandrake/base";
  127. foreach (readdir A){
  128.     /~$/ and next;
  129.     /(^(\.{1,2}|compss|provides|depslist.ordered)$|hdlist|cooker)/ and next;
  130.     -d "$rep/Mandrake/base/$_" and $mkiso .= "\\\n    Mandrake/base/$_/=$rep/Mandrake/base/$_" and next;
  131.     $mkiso .= "\\\n    Mandrake/base/=$rep/Mandrake/base/$_"
  132. }
  133.  
  134. #print "$mkiso\n";
  135. #exit;
  136.  
  137. foreach (@cd) {
  138.     $mkiso .= "\\\n    Mandrake/base/=$work_dir/hdlist$_.cz"
  139. }
  140.  
  141. foreach (@{$rpms[1]}){
  142.     $mkiso .= "\\\n Mandrake/RPMS1/=$_" 
  143. }
  144.  
  145. #print "$mkiso\n"; 
  146. #exit;
  147. system $mkiso;
  148.  
  149. foreach my $n (@cd){
  150.     $n == 1 and next;
  151.     $mkiso = qq{mkisofs -r -J -graft-points -nobak -V "Cooker_CD_$n" -o "$iso/$n-Cooker-i586.iso"}; 
  152.     foreach (@{$rpms[$n]}){
  153.         $mkiso .= "\\\n Mandrake/RPMS$n/=$_"
  154.     }
  155.     $n == @cd and do { foreach (@{$rpms[0]}){
  156.         $mkiso .= "\\\n Mandrake/RPMS$n/=$_"    
  157.     }};
  158.     #    print "$mkiso\n";
  159.     system $mkiso;
  160. }
  161.  
  162. # system("rm -rf $work_dir");
  163.  
  164. foreach (@{$rpms[0]}){
  165.     print "WARNING: $_ not in lists, added to last CD\n"
  166. }
  167.  
  168. exit;
  169.  
  170. sub usage{
  171.     print "mkcd.pl version $version
  172.     usage:
  173.     $0 <repository dir> <iso creation dir>\n";
  174.     exit
  175. }
  176.